package com.itheima.mapper;

import com.itheima.pojo.Emp;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface EmpMapper {

    //根据id删除员工信息
    @Delete("delete from emp where id = #{id}")
    //# 站位符
    // 这里#号的作用是把参数id的值替换到sql语句中,
    // mybatis会自动把参数值替换到#{参数名}中,是采用预编译的方式执行sql语句，提高了安全性，防止sql注入攻击
    //$ 占位符
    // 这里$号的作用是把参数id的值替换到sql语句中,
    // mybatis会自动把参数值替换到$参数名中,是采用拼接方式动态sql的方式执行sql语句，提高了灵活性，但是不安全
    public void deleteEmpById(Integer id);


    //新增员工信息
    @Options(useGeneratedKeys = true, keyProperty = "id") //数据插入成功之后返回id自增主键
    @Insert("insert into emp (name, username, password, gender, image, job, entrydate, dept_id, create_time, update_time)" +
            " values (#{name}, #{username}, #{password}, #{gender}, #{image}, #{job}, #{entryDate}, #{deptId}, #{createTime}, #{updateTime})")
    public void insertEmp(Emp emp);

    //更新员工信息
    @Update("update emp set name = #{name},username = #{username},password = #{password},gender = #{gender},image = #{image}," +
            "job = #{job},entrydate = #{entryDate},dept_id = #{deptId},update_time= #{updateTime} where id = #{id}")
    public void updateEmp(Emp emp);


    //根据id查询员工信息
   /* @Select("select * from emp where id = #{id}")
    public Emp getEmpById(Integer id);*/

    //对员工信息进行数据封装
    //方式1： 手动封装 别名
   /* @Select("select id,name,username,password,gender,image,job,entrydate entryDate,dept_id deptId,create_time createTime,update_time updateTime from emp where id = #{id}")
    public Emp getEmpById(Integer id);*/

    //方式2： @Results注解自动封装
  /*  @Results({
            @Result(property = "entryDate", column = "entrydate"),
            @Result(property = "createTime", column = "create_time"),
            @Result(property = "updateTime", column = "update_time"),
    })
    @Select("select * from emp where id = #{id}")
    public Emp getEmpById(Integer id);*/
    //方式3： mybatis 注解自动封装
    @Select("select * from emp where id = #{id}")
    public Emp getEmpById(Integer id);


    //根据条件查询员工信息  姓名、性别、入职时间、更新时间排序
    //改成 xml 映射文件中配置  sql语句复杂时，使用xml映射文件 配置sql语句 ,sql 简单时,使用注解的方式
//    @Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{startDate} and #{endDate} order by update_time desc")
    public List<Emp> list(@Param("name") String name, @Param("gender") Short gender, @Param("startDate") String startDate, @Param("endDate") String endDate);


    //利用动态sql更新员工信息
    public void updateEmp1(Emp emp);


    //利用动态sql批量删除员工信息
    public void deleteEmps(@Param("ids") List<Integer> ids);

}
